package com.itbaizhan.Work;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

//生产者
public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.66.101");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("itbaizhan");
        connectionFactory.setPassword("itbaizhan");
        connectionFactory.setVirtualHost("/");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //建立信道
        Channel channel = connection.createChannel();
        //创建队列，持久化队列（第二个参数）
        /*
         *参数1：队列名
         * 参数2：是否持久化，true表示MQ重启后队列还在
         * 参数3：是否私有化，false表示所有消费者都可以访问  true表示只有第一次拥有它的消费者才可以访问
         * 参数4： 是否自动删除，true表示不再使用队列时自动删除队列
         * 参数5：其他的额外参数
         * */
        channel.queueDeclare("work_queue",true,false,false,null);
        //发送大量的消息，
        // 参数1：交换机名， "" 表示默认的交换机
        // 队列名
        // 参数3表示该消息为持久化消息，即除了保存到内存还会保存到磁盘中（这样更安全,rabbitMQ出问题了，也保存在磁盘中）
        //参数4：要发送的消息
        for(int i=1;i<= 100;i++){
            channel.basicPublish("","work_queue", MessageProperties.PERSISTENT_TEXT_PLAIN,
                    ("你好，这是第"+i+"条消息").getBytes(StandardCharsets.UTF_8));
        }

        //关闭资源
        channel.close();
        connection.close();

    }
}
/*与简单模式相比，工作队列模式(Work Queue)多了一些消费者，该模式也使用direct交换机，应用于处理消息较多的情况。特点如下：

一个队列对应多个消费者。
一条消息只会被一个消费者消费。
消息队列默认采用轮询的方式将消息平均发送给消费者。*/